/**
 * 
 */
package de.midnightdance.admin.test;

import java.util.ArrayList;
import java.util.List;

import de.midnightdance.admin.ws.WebServiceAdminRequiem;
import de.midnightdance.admin.ws.entities.Bund;
import de.midnightdance.admin.ws.entities.Clan;
import de.midnightdance.admin.ws.entities.DisziplinDB;
import de.midnightdance.admin.ws.entities.JagdTechnik;
import de.midnightdance.admin.ws.entities.RequiemUser;
import de.midnightdance.admin.ws.entities.Ritual;
import de.midnightdance.admin.ws.entities.VorteilDB;
import de.midnightdance.admin.ws.entities.arrays.BundArray;
import de.midnightdance.admin.ws.entities.arrays.ClanArray;
import de.midnightdance.admin.ws.entities.arrays.DisziplinDBArray;
import de.midnightdance.admin.ws.entities.arrays.JagdTechnikArray;
import de.midnightdance.admin.ws.entities.arrays.RequiemUserArray;
import de.midnightdance.admin.ws.entities.arrays.RitualArray;
import de.midnightdance.admin.ws.entities.arrays.VorteilDBArray;

/**
 * object to mock(impersonate) the WebService if it is unavailable for some reason<br>
 * will imitate persistence bykeeping data in memory
 * 
 * @author Stefan Alter
 *  
 */
public class MockWebServiceAdminRequiem implements WebServiceAdminRequiem {
	
	private List<Bund> 			bundList ;
	private List<Clan> 			clanList ;
	private List<DisziplinDB> 	disziplinList ;
	private List<JagdTechnik> 	jagdTechnikList ;
	private List<Ritual> 		ritualList ;
	private List<RequiemUser> 	userList ;
	private List<VorteilDB> 	vorteilList ;
	
	public MockWebServiceAdminRequiem() {
		super();
		vorteilList 	= new ArrayList<VorteilDB>();
		bundList 		= new ArrayList<Bund>();
		clanList 		= new ArrayList<Clan>();
		disziplinList 	= new ArrayList<DisziplinDB>();
		jagdTechnikList = new ArrayList<JagdTechnik>();
		ritualList 		= new ArrayList<Ritual>();
		userList 		= new ArrayList<RequiemUser>();
		//
		initBuende();
		initClans();
		initDisziplinen();
		initJagdtechniken();
		initRituale();
		initUsers();
		initVorteile();		
	}
	
	private void initBuende() {
		List<Bund> testList = TestDataProviderAdminClient.getBuende();
		for (Bund testEntity : testList) {
			bundList.add(testEntity);
		}			
	}
	
	private void initClans() {
		List<Clan> testList = TestDataProviderAdminClient.getClans();
		for (Clan testEntity : testList) {
			clanList.add(testEntity);
		}			
	}
	
	private void initDisziplinen() {
		List<DisziplinDB> testList = TestDataProviderAdminClient.getDisziplinen();
		for (DisziplinDB disziplinDB : testList) {
			disziplinList.add(disziplinDB);
		}		
	}
	private void initJagdtechniken() {
		List<JagdTechnik> testList = TestDataProviderAdminClient.getJagdTechniken();
		for (JagdTechnik testEntity : testList) {
			jagdTechnikList.add(testEntity);
		}			
	}

	private void initRituale() {
		List<Ritual> testList = TestDataProviderAdminClient.getRituale();
		for (Ritual testEntity : testList) {
			ritualList.add(testEntity);
		}		
	}	
	
	private void initUsers() {
		List<RequiemUser> testList = TestDataProviderAdminClient.getUsers();
		for (RequiemUser user : testList) {
			userList.add(user);
		}		
	}

	private void initVorteile() {
		List<VorteilDB> testList = TestDataProviderAdminClient.getVorteile();
		for (VorteilDB vorteilDB : testList) {
			vorteilList.add(vorteilDB);
		}		
	}
		
	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#addBund(de.midnightdance.admin.ws.Bund, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int addBund(Bund arg0, RequiemUser arg1)
	{
		bundList.add(arg0);
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#addClan(de.midnightdance.admin.ws.Clan, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int addClan(Clan arg0, RequiemUser arg1)
	{
		clanList.add(arg0);
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#addDisziplin(de.midnightdance.admin.ws.DisziplinDB, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int addDisziplin(DisziplinDB arg0, RequiemUser arg1)
	{
		disziplinList.add(arg0);
		System.out.println("Mocking Service saved following DisziplinDB: "+arg0.getName());
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#addJagdTechnik(de.midnightdance.admin.ws.JagdTechnik, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int addJagdTechnik(JagdTechnik arg0, RequiemUser arg1)
	{
		jagdTechnikList.add(arg0);
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#addRitual(de.midnightdance.admin.ws.Ritual, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int addRitual(Ritual arg0, RequiemUser arg1)
	{
		ritualList.add(arg0);
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#addUser(de.midnightdance.admin.ws.RequiemUser, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int addUser(RequiemUser arg0, RequiemUser arg1)
	{
		userList.add(arg0);
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#addVorteil(de.midnightdance.admin.ws.Vorteil, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int addVorteil(VorteilDB arg0, RequiemUser arg1)
	{
		vorteilList.add(arg0);
		System.out.println("Mocking Service saved following VorteilDB: "+arg0.getName());
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#changeUser(de.midnightdance.admin.ws.RequiemUser, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int changeUser(RequiemUser arg0, RequiemUser arg1)
	{
		System.err.println("ChangeUser not implemented!!");
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#getBuende(de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public BundArray getBuende(RequiemUser arg0)
	{
		//
		return new MockBundArray();
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#getClane(de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public ClanArray getClane(RequiemUser arg0)
	{
		//
		return new MockClanArray();
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#getDisziplinen(de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public DisziplinDBArray getDisziplinen(RequiemUser arg0)
	{
		//
		return new MockDisziplinArray();
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#getJagdtechniken(de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public JagdTechnikArray getJagdtechniken(RequiemUser arg0)
	{
		//
		return new MockJagdTechnikArray();
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#getRituale(de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public RitualArray getRituale(RequiemUser arg0)
	{
		//
		return new MockRitualArray();
	}
	@Override
	public RequiemUserArray getAllUsers(RequiemUser arg0) {
		return new MockUserArray();
	}
	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#getVorteile(de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public VorteilDBArray getVorteile(RequiemUser arg0)
	{		
		return new MockVorteilArray();
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#isAuthenticUser(de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public RequiemUser isAuthenticUser(RequiemUser arg0) {		 
		int index = userList.indexOf(arg0);
		return userList.get(index);
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#removeBund(de.midnightdance.admin.ws.Bund, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int removeBund(Bund arg0, RequiemUser arg1)
	{
		bundList.remove(arg0);
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#removeClan(de.midnightdance.admin.ws.Clan, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int removeClan(Clan arg0, RequiemUser arg1)
	{
		clanList.remove(arg0);
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#removeDisziplin(de.midnightdance.admin.ws.DisziplinDB, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int removeDisziplin(DisziplinDB arg0, RequiemUser arg1)
	{
		disziplinList.remove(arg0);
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#removeJagdTechnik(de.midnightdance.admin.ws.JagdTechnik, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int removeJagdTechnik(JagdTechnik arg0, RequiemUser arg1)
	{
		jagdTechnikList.remove(arg0);
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#removeRitual(de.midnightdance.admin.ws.Ritual, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int removeRitual(Ritual arg0, RequiemUser arg1)
	{
		ritualList.remove(arg0);
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#removeUser(de.midnightdance.admin.ws.RequiemUser, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int removeUser(RequiemUser arg0, RequiemUser arg1)
	{
		userList.remove(arg0);
		return 0;
	}

	/* (non-Javadoc)
	 * @see de.midnightdance.admin.ws.WebServiceAdminRequiem#removeVorteil(de.midnightdance.admin.ws.Vorteil, de.midnightdance.admin.ws.RequiemUser)
	 */
	@Override
	public int removeVorteil(VorteilDB arg0, RequiemUser arg1)
	{
		vorteilList.remove(arg0);
		return 0;
	}
	
	
	private class MockBundArray extends BundArray{
		/* (non-Javadoc)
		 * @see de.midnightdance.admin.ws.VorteilArray#getItem()
		 */
		@Override
		public List<Bund> getItem() {			
			return bundList;
		}		
	}
	private class MockClanArray extends ClanArray{
		/* (non-Javadoc)
		 * @see de.midnightdance.admin.ws.VorteilArray#getItem()
		 */
		@Override
		public List<Clan> getItem() {			
			return clanList;
		}		
	}
	private class MockDisziplinArray extends DisziplinDBArray{
		/* (non-Javadoc)
		 * @see de.midnightdance.admin.ws.VorteilArray#getItem()
		 */
		@Override
		public List<DisziplinDB> getItem() {			
			return disziplinList;
		}		
	}
	private class MockJagdTechnikArray extends JagdTechnikArray{
		/* (non-Javadoc)
		 * @see de.midnightdance.admin.ws.VorteilArray#getItem()
		 */
		@Override
		public List<JagdTechnik> getItem() {			
			return jagdTechnikList;
		}		
	}
	private class MockRitualArray extends RitualArray{
		/* (non-Javadoc)
		 * @see de.midnightdance.admin.ws.VorteilArray#getItem()
		 */
		@Override
		public List<Ritual> getItem() {			
			return ritualList;
		}		
	}
	
	private class MockUserArray extends RequiemUserArray{
		/* (non-Javadoc)
		 * @see de.midnightdance.admin.ws.VorteilArray#getItem()
		 */
		@Override
		public List<RequiemUser> getItem() {			
			return userList;
		}		
	}
	
	private class MockVorteilArray extends VorteilDBArray{
		/* (non-Javadoc)
		 * @see de.midnightdance.admin.ws.VorteilArray#getItem()
		 */
		@Override
		public List<VorteilDB> getItem() {			
			return vorteilList;
		}		
	}


	
}
